<html>
    <head>
        <title>审计属性基类和接口</title>
    </head>
    <body>
        <script>
            /*
                        三、审计属性的基类和接口  
                        
                                有一些属性，如CreationTime、CreatorId、LastModificationTime…在所有应用程序中都很常见。

                                ABP提供了一些接口和基类来标准化这些属性，并且自动设置它们的值。

                                1、审计接口  Auditing Intreface  

                                                        有很多审计接口，因此你可以实现你需要的接口。

                                                        虽然你可以手动实现这些接口，但你可以使用下一节中定义的基类来简化它。


                                                        ①、IHasCreationTime定义了以下属性：
                                                                                
                                                                        CreationTime

                                                        ②、IMayHaveCreator定义了以下属性：
                    
                                                                        CreatorId

                                                        ③、ICreationAuditedObject继承自IHasCreationTime和IMayHaveCreator，因此它定义了以下属性：

                                                                        CreationTime
                                                                        CreatorId

                                                        ④、IHasModificationTime定义了以下属性：
                                                
                                                                        LastModificationTime

                                                        ⑤、IModificationAuditedObject扩展了IHasModificationTime并添加了LastModifierId属性。因此，它定义了以下属性：

                                                                        LastModificationTime
                                                                        LastModifierId

                                                        ⑥、IAuditedObject扩展了ICreationAuditedObject和IModificationAuditedObject，因此它定义了以下属性：

                                                                        CreationTime
                                                                        CreatorId
                                                                        LastModificationTime
                                                                        LastModifierId

                                                        ⑦、ISoftDelete（参见数据过滤文档）定义了以下属性：

                                                                        IsDeleted

                                                        ⑧、IHasDeletionTime扩展了ISoftDelete并添加了DeletionTime属性。因此，它定义了以下属性：

                                                                        IsDeleted
                                                                        DeletionTime

                                                        ⑨、IDeletionAuditedObject扩展了IHasDeletionTime并添加了DeleterId属性。因此，它定义了以下属性：

                                                                        IsDeleted
                                                                        DeletionTime
                                                                        DeleterId

                                                        ⑩、IFullAuditedObject继承自IAuditedObject和IDeletionAuditedObject，因此它定义了以下属性：

                                                                        CreationTime
                                                                        CreatorId
                                                                        LastModificationTime
                                                                        LastModifierId
                                                                        IsDeleted
                                                                        DeletionTime
                                                                        DeleterId

                                                一旦你实现了任何接口，或者从下一节中定义的类派生，ABP就会尽可能自动管理这些属性。



                               2、审计基类  Auditing Base Class

                                                
                                          虽然你可以手动实现上面定义的任何接口，但建议从此处定义的基类继承：
                                          
                                                ①、CreationAuditedEntity<TKey>和CreationAuditedAggregateRoot<TKey>实现ICreationAuditedObject接口。

                                                ②、AuditedEntity<TKey>和AuditedAggregateRoot<TKey>实现IAuditedObject接口。

                                                ③、FullAuditedEntity<TKey>和FullAuditedAggregateRoot<TKey>实现IFullAuditedObject接口。

                                         所有这些基类也有非泛型版本，以采用AuditedEntity和FullAuditedAggregateRoot来支持复合主键。


                                         所有这些基类也有...WithUser对，如FullAuditedAggregateRootWithUser<TUser>和FullAuditedAggregateRootWithUser<TKey, TUser>。
                                        
                                        这使得向你的用户实体添加导航属性成为可能。

                                        但是，在聚合根之间添加导航属性不是一个好的做法，
                                        
                                        因此不建议使用这种用法（除非你使用的是ORM，如EF Core，它很好地支持这种情况并且你真的需要它——否则请记住，这种方法不适用于MongoDB等非关系型数据库，你必须真正实现聚合模式）。

                                        此外，如果你将导航属性添加到启动模板随附的AppUser类，请考虑在迁移数据库上下文中处理（忽略/映射）它（请参阅EF Core迁移文档）。
                    */
        </script>
    </body>
</html>